
--- 采集、上传数据管理
module(..., package.seeall)

local cfg = db.new("/lua/udata.cfg")
local udata = cfg and cfg:export() or {}
local cdata = {} --当前val
--- 追加一条数据，日期自动生成,自动保存
--- @param v table
--- @return udata
--- @usage
--- userdata.put({123,456})
--- userdata.put(123)
function push()
    if #udata>120 then 
        table.remove(udata,1)
    end
    if cdata.dt then
        table.insert(udata, cdata)
        save()
    end
end
--- 更新最新一条数据 #list
---@param v table|any
function update(v)
    if type(v) == 'table' then
        cdata = {val = v, dt = os.time()}
    else
        cdata = { val = {v}, dt = os.time()}
    end
    local hex1 = string.pack(">f",tonumber(cdata.val[1] or 0))
    local hex2 = string.pack(">f",tonumber(cdata.val[2] or 0))
    local _,v1H,v1L = string.unpack(">HHHH",hex1)
    local _,v2H,v2L = string.unpack(">HHHH",hex2)
    modbus_slave.REG_T[0x03][2]= v1H
    modbus_slave.REG_T[0x03][3]= v1L
    modbus_slave.REG_T[0x03][4]= v2H
    modbus_slave.REG_T[0x03][5]= v2L
    sys.publish("USRDATA_UPDATE",cdata)
end
--- 返回最新的数据，最新数据也将删除，不删除数据请用getVal(n)
---@return val table
function pop()
    if #udata == 0 then return end
    return table.remove(udata,1)
end

--- 返回最新的数据
---@param pos number 坐标，如果为空是最新的数据#list
---@return val table
function getVal(pos)
    if pos and type(pos) == 'number' then
        return udata[pos]
    end
    return cdata
end
function get() return udata end
function size() return #udata end
function clear()
    udata = {}
    save()
end

--- 数据持久化
function save()
    if cfg then cfg:import(udata) end
end
--- 导出数据表
-- @param dbtype: 导出数据类型可选 "string" or "table"
-- @return table or json string
-- @usage local t = usrdata.export()|usrdata.export("string")
function export(dbtype)
    if dbtype == "string" then return json.encode(udata) end
    return udata
end
